package es.decloud.model;

import java.io.Serializable;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import org.apache.commons.lang.builder.ToStringBuilder;
import org.hibernate.search.annotations.DocumentId;
import org.hibernate.search.annotations.Field;
import org.hibernate.search.annotations.Indexed;

@Entity
@Table(name = "album")
@Indexed
public class Album extends BaseObject implements Serializable {

	private static final long serialVersionUID = 4326053550543638208L;

	private long id;
	private Centro centro;
	private String nombre;
	private String descripcion;
	private Date fechaActualizacion;
	private Date fechaBaja;
	private Set<Fichero> ficheros = new HashSet<>(0);

	public Album() {
	}

	public Album(long id, Centro centro, String nombre) {
		this.id = id;
		this.centro = centro;
		this.nombre = nombre;
	}

	public Album(long id, Centro centro, String nombre, String descripcion, Date fechaActualizacion, Date fechaBaja,
			Set<Fichero> ficheros) {
		this.id = id;
		this.centro = centro;
		this.nombre = nombre;
		this.descripcion = descripcion;
		this.fechaActualizacion = fechaActualizacion;
		this.fechaBaja = fechaBaja;
		this.ficheros = ficheros;
	}

	@Id
	@Column(name = "id", unique = true, nullable = false)
	@DocumentId
	public long getId() {
		return this.id;
	}

	public void setId(long id) {
		this.id = id;
	}

	@ManyToOne
	@JoinColumn(name = "centro_id", nullable = false)
	public Centro getCentro() {
		return this.centro;
	}

	public void setCentro(Centro centro) {
		this.centro = centro;
	}

	@Column(name = "nombre", nullable = false, length = 100)
	@Field
	public String getNombre() {
		return this.nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	@Column(name = "descripcion")
	@Field
	public String getDescripcion() {
		return this.descripcion;
	}

	public void setDescripcion(String descripcion) {
		this.descripcion = descripcion;
	}

	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "fecha_actualizacion", length = 19)
	public Date getFechaActualizacion() {
		return this.fechaActualizacion;
	}

	public void setFechaActualizacion(Date fechaActualizacion) {
		this.fechaActualizacion = fechaActualizacion;
	}

	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "fecha_baja", length = 19)
	public Date getFechaBaja() {
		return this.fechaBaja;
	}

	public void setFechaBaja(Date fechaBaja) {
		this.fechaBaja = fechaBaja;
	}

	@ManyToMany
	@JoinTable(name = "album_fichero", joinColumns = { @JoinColumn(name = "album_id", nullable = false) }, inverseJoinColumns = { @JoinColumn(name = "fichero_id", nullable = false) })
	public Set<Fichero> getFicheros() {
		return this.ficheros;
	}

	public void setFicheros(Set<Fichero> ficheros) {
		this.ficheros = ficheros;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((centro == null) ? 0 : centro.hashCode());
		result = prime * result + ((nombre == null) ? 0 : nombre.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Album other = (Album) obj;
		if (centro == null) {
			if (other.centro != null)
				return false;
		}
		else if (!centro.equals(other.centro))
			return false;
		if (nombre == null) {
			if (other.nombre != null)
				return false;
		}
		else if (!nombre.equals(other.nombre))
			return false;
		return true;
	}

	@Override
	public String toString() {
		return new ToStringBuilder(this).append("id", id).append("centro", centro).append("nombre", nombre)
				.append("descripcion", descripcion).append("fechaActualizacion", fechaActualizacion)
				.append("fechaBaja", fechaBaja).toString();
	}

}
